/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.estrutura;

import delaunay_triangulation.Point_dt;
import delaunay_triangulation.Triangle_dt;
import java.io.Serializable;
import java.util.Iterator;

/**
 *
 * @author Thiago
 */
public class MalhaIrregular extends Poligono implements Serializable {
    
    public void setMalha(Iterator<Triangle_dt> iterator) {
        boolean ehTres = true;
        Ponto p1n, p2n, p3n;
        Point_dt p1, p2, p3, aux;
        p1n = p2n = p3n = null;
        for (Iterator it = iterator; it.hasNext();) {
            Triangle_dt next = (Triangle_dt) it.next();
            //Pega os pontos do triangulo
            p1 = next.p1();
            p2 = next.p2();
            p3 = next.p3();

            //Se este triangulo possui o 3 vértice
            if (p3 != null) {
                
//                double nz = ( (p2.x()-p1.x()) * (p3.y()-p1.y()) * (p3.x()-p1.x() * (p2.y()-p1.y())));
//                if(nz < 0){
//                    aux = p3;
//                    p3 = p2;
//                    p2 = aux;
//                }
                
                //Converte os pontos para a estrutura do programa
                p1n = new Ponto(p1.x(), p1.y(), p1.z());
                p2n = new Ponto(p2.x(), p2.y(), p2.z());
                p3n = new Ponto(p3.x(), p3.y(), p3.z());
                //Verifica se o ponto já existe
                for (Ponto p : this.getListaPontos()) {
                    if (p.equals(p1n)) {  //Se o p1n já existe
                        p1n = p;
                    }
                    if (p.equals(p2n)) {  //Se o p2n já existe
                        p2n = p;
                    }
                    if (p.equals(p3n)) {  //Se o p3n já existe
                        p3n = p;
                    }
                }
                //Adiciona o ponto na lista de pontos da malha
                this.addPonto(p1n);
                this.addPonto(p2n);
                this.addPonto(p3n);

                //Cria as outras arestas
                Aresta a1 = new Aresta(p1n, p2n);
                Aresta a2 = new Aresta(p2n, p3n);
                Aresta a3 = new Aresta(p3n, p1n);
                //Verifica se as arestas já existem
                for (Aresta a : this.getListaArestas()) {
                    if (a.equals(a1)) {  //Se a a1 já existe
                        a1 = a;
                    }
                    if (a.equals(a2)) {  //Se a a2 já existe
                        a2 = a;
                    }
                    if (a.equals(a3)) {  //Se a a3 já existe
                        a3 = a;
                    }
                }
                //Adiciona as arestas adjacentes
                a1.addArestaAdjacente(a3);
                a1.addArestaAdjacente(a2);
                a2.addArestaAdjacente(a1);
                a2.addArestaAdjacente(a3);
                a3.addArestaAdjacente(a2);
                a3.addArestaAdjacente(a1);
                //Adiciona as arestas na lista de arestas da malha
                this.addAresta(a1);
                this.addAresta(a2);
                this.addAresta(a3);
                //Adiciona as outras arestas na lista de arestas da face
                Face f = new Face();
                f.addAresta(a1);
                f.addAresta(a2);
                f.addAresta(a3);
                //Adiciona a face na malha
                this.addFace(f);
            } else {
                    //---------------------
                //Cria a face F1
                //---------------------
                p1n = new Ponto(p1.x(), p1.y(), p1.z());
                p2n = new Ponto(p2.x(), p2.y(), p2.z());

                Triangle_dt d = next.next_31();
                p3n = new Ponto(d.p2().x(), d.p2().y(), d.p2().z());

                //Verifica se o ponto p3 já existe
                for (Ponto p : this.getListaPontos()) {
                    if (p.equals(p1n)) {  //Se o p1n já existe
                        p1n = p;
                    }
                    if (p.equals(p2n)) {  //Se o p2n já existe
                        p2n = p;
                    }
                    if (p.equals(p3n)) {  //Se o p3n já existe
                        p3n = p;
                    }
                }
                //Adiciona o ponto na lista de pontos da malha
                this.addPonto(p1n);
                this.addPonto(p2n);
                this.addPonto(p3n);
                //Cria as outras arestas
                Aresta a1 = new Aresta(p1n, p2n);
                Aresta a2 = new Aresta(p2n, p3n);
                Aresta a3 = new Aresta(p3n, p1n);
                //Verifica se as arestas já existem
                for (Aresta a : this.getListaArestas()) {
                    if (a.equals(a1)) {  //Se a a1 já existe
                        a1 = a;
                    }
                    if (a.equals(a2)) {  //Se a a2 já existe
                        a2 = a;
                    }
                    if (a.equals(a3)) {  //Se a a3 já existe
                        a3 = a;
                    }
                }
                //Adiciona as arestas adjacentes
                a1.addArestaAdjacente(a3);
                a1.addArestaAdjacente(a2);
                a2.addArestaAdjacente(a1);
                a2.addArestaAdjacente(a3);
                a3.addArestaAdjacente(a2);
                a3.addArestaAdjacente(a1);
                //Adiciona as arestas na lista de arestas da malha
                this.addAresta(a1);
                this.addAresta(a2);
                this.addAresta(a3);
                //Adiciona as outras arestas na lista de arestas da face
                Face f1 = new Face();
                f1.addAresta(a1);
                f1.addAresta(a2);
                f1.addAresta(a3);
                //Adiciona a face na malha
                this.addFace(f1);

            }
        }
    }
    
    public String toString(){
        String ret = "";
        ret += "Quantidade de faces:" + this.listaFaces.size() + "\n";
        ret += "Quantidade de arestas:" + this.listaArestas.size() + "\n";
        ret += "Quantidade de pontos:" + this.listaPontos.size() + "\n";
        return ret;
    }
}
